//
//  ViewController.m
//  block
//
//  Created by MyMac on 15/6/1.
//  Copyright (c) 2015年 MyMac. All rights reserved.
//

#import "ViewController.h"
typedef void(^block) ();
@interface ViewController ()
@property(nonatomic,strong)NSMutableString*name;
@property(nonatomic,copy)block  b;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor=[UIColor whiteColor];
     NSMutableString*str=[[NSMutableString alloc]initWithFormat:@"%d",1111];
  __block  NSString*s=@"11111";
   NSMutableString*temp=str;//指针复制
    self.name=[NSMutableString stringWithString:@"aaaaaa"];
    //在ARC中是没有栈Block的，，只有静态全局Block和堆Block
    
    //ARC下__block修饰的变量并不能解决循环引用的问题
    
    //ARC下，并没有直接操作外部变量，没有不指针复制的办法，，，__block修饰也不行
    
    //对于一个局部变量，在block中修改或重新赋值的话，需要用__block修饰
    //对于block引用外部"局部"变量，会对这个局部变量指针复制一次，虽然最终指向的对象是一样的，但存放指针的指针是不一样的，所以&str前后不一样，当引用全局变量时不复制
    //block引用外部局部变量时，就是为了防止局部变量释放，所以才会对其指针复制一次，即使出了作用域，block还是会对这个指针强引用，所以这个局部变量不会立刻释放
    //
  __block  int j  = 10;
 __block  int i=100;
    //NSLog(@"A %p  %p %@ %p   %p",&temp,temp,temp,&str,str);
   //NSLog(@"C %p   %p",&_name,self.name);
    NSLog(@"%p  %p %@",s,&s,s);
    NSLog(@"%p",&j);
    void(^c)()=^{//对于未引用外部变量，block为静态全局block
       i++;
//        j++;
        NSLog(@"%p",&j);
        s=@"dddddd";
         NSLog(@"%p  %p %@",s,&s,s);
        NSLog(@"%p  %p %@",s,&s,s);
       // NSString*s=@"222";
//        [str appendString:@"2222"];
//        NSLog(@"B %p  %p %@  %p  %p ",&temp,temp,temp,&str,str);
        //NSLog(@"C %p   %p",&_name,self.name);
    
    };
   
    __block typeof(self) vc=self;
       self.b=^{//只有对block执行copy时才会声称堆block，但ARC下没有栈block，所以在饮用外部变量时都是堆block
           //NSLog(@"B %p  %p %@  %p  %p ",&temp,temp,temp,&str,str);
           NSLog(@"%@",s);
      //NSLog(@"D %p **%@ %@",str,str,vc.name);
       
    };
    [str appendString:@"aaaaaa"];
   //  s=@"22222";
    NSLog(@"%p  %p %@",s,&s,s);
    c();
    
    
    NSLog(@"%@***%@",s,self.b);
     [str appendString:@"aaaaaa"];
    //[str release];
   // NSLog(@"C %p  %@ %d  %ld",str,str,i,[str retainCount]);
   
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
 self.b();

}
- (IBAction)b:(id)sender {
   
}
-(void)dealloc
{
    NSLog(@"释放");

}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
